ssh / openssh / ssh tunnel / ssh-keygen
- openssh — для SSH-з'єднання.
sudo pacman -S openssh sshpass net-tools
- sshpass — для автоматизації введення пароля (опціонально).
- net-tools — для роботи з мережевими інструментами (наприклад, ifconfig).
Налаштуйте SSH
На комп'ютері, до якого ви хочете підключитися: Запустіть SSH-сервер:
sudo systemctl start sshd
sudo systemctl enable sshd
sudo systemctl status sshd
Дізнайтеся IP-адресу цього комп'ютера:
ip a
На комп'ютері, з якого ви підключаєтеся:
ssh user@192.168.1.100
Якщо ви хочете автоматизувати введення пароля, використовуйте sshpass:
sshpass -p 'your_password' ssh user@192.168.1.10
Налаштуйте спільний доступ до файлів
Для обміну файлами між комп'ютерами можна використовувати scp
, rsync
або налаштувати спільну папку через NFS
або Samba
.
Використання scp
:
Щоб скопіювати файл з одного комп'ютера на інший:
scp /шлях/до/файлу user@ip_address:/шлях/до/призначення
Наприклад:
scp myfile.txt user@192.168.1.100:/home/user/
Використання rsync
:
rsync
дозволяє синхронізувати файли між комп'ютерами:
rsync -avz /шлях/до/файлу user@ip_address:/шлях/до/призначення
Налаштуйте NFS (опціонально)
Якщо вам потрібен спільний доступ до тек, можна налаштувати NFS (Network File System).
На сервері (комп'ютері, який надає доступ до тек):
-
Встановіть NFS:
sudo pacman -S nfs-utils
-
Налаштуйте експортовану теку у файлі
/etc/exports
. Додайте рядок:/шлях/до/папки ip_address(rw,sync,no_subtree_check)
Наприклад:
/home/user/shared 192.168.1.0/24(rw,sync,no_subtree_check)
-
Перезапустіть NFS-сервер:
sudo systemctl restart nfs-server
На клієнті (комп'ютері, який підключається до теки):
-
Встановіть NFS:
sudo pacman -S nfs-utils
-
Підключіть теку:
sudo mount -t nfs ip_address:/шлях/до/папки /шлях/до/точки/монтування
Наприклад:
sudo mount -t nfs 192.168.1.100:/home/user/shared /mnt/shared
Перевірте з'єднання
Переконайтеся, що всі налаштування працюють. Використовуйте ping
для перевірки зв'язку між комп'ютерами:
ping ip_address
Наприклад:
ping 192.168.1.100
Інструкція зі створення SSH-ключів та копіювання їх на віддалений сервер
1. Створення SSH-ключів
Відкрийте термінал та виконайте наступну команду:
ssh-keygen -t ed25519 -C "ваш_коментар@приклад"
> Зараз не обов’язково вводити -t ed25519
, ssh-keygen вже за замовчуванням створює id_ed25519
замість id_rsa
>
(Або для старіших систем використайте ssh-keygen -t rsa -b 4096 -C "ваш_email@приклад"
)
- Натисніть Enter, щоб зберегти ключ у стандартній папці (
~/.ssh/
). - Введіть пароль (опціонально, але рекомендовано для додаткової безпеки).
Після виконання у папці ~/.ssh/
з’являться два файли:
-
id_ed25519
(абоid_rsa
) – приватний ключ (нікому не передавати!). -
id_ed25519.pub
(абоid_rsa.pub
) – публічний ключ (копіюємо на сервер).
2. Копіювання ключа на сервер
Використайте утиліту ssh-copy-id
:
ssh-copy-id -i ~/.ssh/id_ed25519.pub username@remote_server_ip
(Замініть username
та remote_server_ip
на свої дані)
Якщо ssh-copy-id
недоступна, скопіюйте ключ вручну:
cat ~/.ssh/id_ed25519.pub | ssh username@remote_server_ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"
3. Перевірка підключення
Спробуйте підключитись до сервера:asw
ssh username@remote_server_ip
Якщо все правильно, сервер не запросить пароль (якщо не встановлено пароль на ключ).
4. Вимкнення авторизації по паролю (опціонально)
Для підвищення безпеки на сервері у файлі /etc/ssh/sshd_config
змініть:
PasswordAuthentication no
Потім перезавантажте SSH:
sudo systemctl restart sshd
Готово! Тепер ви можете підключатись до сервера за допомогою SSH-ключа. 🔑
Вибір стратегії для SSH-ключів
-
Один ключ для всіх серверів
-
Переваги:
- Простота (не потрібно керувати кількома ключами).
- Легко додавати нові сервери (просто копіюєте той самий публічний ключ).
-
Недоліки:
- Якщо ключ буде скомпрометовано, зламані всі сервери.
- Немає ізоляції між серверами.
-
Переваги:
-
Окремий ключ для кожного сервера
-
Переваги:
-
Безпека (компрометація одного ключа не впливає на інші сервери).
-
Можливість відкликати доступ лише до певного сервера.
-
-
Недоліки:
- Складніше керувати (особливо якщо серверів багато).
-
Переваги:
Як створити ключ з іншою назвою (для окремих серверів)
-
Генерація ключа зі своєю назвою
Використовуйте параметр
-f
для вказання шляху до файлу:ssh-keygen -t ed25519 -f ~/.ssh/my_server_key -C "коментар"
-
Це створить:
- Приватний ключ:
~/.ssh/my_server_key
- Публічний ключ:
~/.ssh/my_server_key.pub
- Приватний ключ:
-
Копіювання ключа на сервер
Використовуйте
ssh-copy-id
з явним вказанням ключа:
ssh-copy-id -i ~/.ssh/my_server_key.pub username@server_ip
Або вручну (як у вашому прикладі):
cat ~/.ssh/my_server_key.pub | ssh username@server_ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"
-
Підключення з вибором ключа
Додайте параметр
-i
до командиssh
:
ssh -i ~/.ssh/my_server_key username@server_ip
Як уникнути перезапису id_ed25519
-
SSH за замовчуванням використовує ключі зі стандартними іменами (
id_ed25519
,id_rsa
тощо). - Якщо ви створюєте ключ з іншою назвою (наприклад,
my_server_key
), вам завжди потрібно вказувати його явно черезi
.
Покращений підхід: конфіг SSH (~/.ssh/config
)
Щоб не вводити -i
щоразу, створіть/відредагуйте файл ~/.ssh/config
:
Host my-server-alias
HostName server_ip
User username
IdentityFile ~/.ssh/my_server_key
Тепер підключайтесь просто:
ssh my-server-alias
Висновок: що вибрати?
- Для персонального використання (наприклад, домашні сервери) – одного ключа достатньо.
-
Для продакшн-середовищ або критичних серверів – окремі ключі +
~/.ssh/config
для зручності. - Якщо ви хочете максимальної безпеки – ключі на рівні серверів/проєктів + регулярне обертання (заміна) ключів.
Важливо: Ніколи не використовуйте один ключ для серверів з різним рівнем конфіденційності (наприклад, тестовий і банківський сервер).
GitHub & ssh
Створити ключ:
ssh-keygen -t ed25519 -f ~/.ssh/github -C "github_key"
Налаштувати ~/.ssh/config
:
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/github
IdentitiesOnly yes
Додати ключ до GitHub:
- Settings → SSH and GPG keys → New SSH key
- В поле “Key” вставляємо вміст файла github.pub
- Add SSH key
Перевірити з'єднання:
❯ ssh -T git@github.com
Hi peturik! You've successfully authenticated, but GitHub does not provide shell access.
Перевірити чи підключення здійснюється через https чи ssh
git remote -v
В разі потреби змінити https на ssh
git remote set-url origin [git@github.com](mailto:git@github.com):peturik/lucia_auth_2.git
git remote -v
Передача файлів по SSH. Інструменти.
Передача файлів по SSH є безпечним та надійним способом переміщення даних між комп'ютерами. Існує кілька основних інструментів, які використовують протокол SSH для цієї мети:
SCP (Secure Copy Protocol):
- Призначення: SCP - це простий і ефективний інструмент для копіювання файлів та каталогів. Він використовує SSH для автентифікації та шифрування даних під час передачі.
- Переваги: Швидкість, простота у використанні, вбудований у більшість систем на базі Unix/Linux.
- Недоліки: Не має інтерактивних функцій (як SFTP), не підтримує відновлення перерваних передач.
Основні команди:
- Копіювання файлу з локального комп'ютера на віддалений:
scp mydocument.txt user@example.com:/home/user/documents/
- Копіювання файлу з віддаленого комп'ютера на локальний:
scp user@example.com:/var/log/syslog.log ./logs/
- Копіювання каталогу (рекурсивно) з локального на віддалений:
scp -r myproject/ user@example.com:/home/user/projects/
- Копіювання з нестандартним портом SSH (-P велика буква):
scp -P 2222 mydocument.txt user@example.com:/home/user/
SFTP (SSH File Transfer Protocol):
- Призначення: SFTP є більш функціональним протоколом, ніж SCP. Він надає можливості, подібні до FTP (наприклад, перегляд каталогів, зміна дозволів), але працює поверх SSH, забезпечуючи безпеку.
- Переваги: Безпека (шифрування), інтерактивний режим, підтримка відновлення перерваних передач, розширені можливості управління файлами.
- Недоліки: Може бути трохи повільнішим за SCP для простих копіювань.
Основні команди (в інтерактивному режимі):
- Підключення до віддаленого сервера:
sftp user@example.com
Після підключення ви потрапите в інтерактивну оболонку SFTP.
- Завантаження файлу з віддаленого сервера (з SFTP-оболонки):
get віддалений_файл [локальний_шлях]
# Приклад:
get /var/www/html/index.html
# або
get /var/www/html/image.jpg ./downloads/new_image.jpg
- Вивантаження файлу на віддалений сервер (з SFTP-оболонки):
put локальний_файл [віддалений_шлях]
# Приклад:
put mylocalfile.txt
# або
put ~/documents/report.pdf /home/user/reports/
- Перегляд вмісту віддаленого каталогу:
ls
- Зміна віддаленого каталогу:
cd /віддалений/шлях
- Зміна локального каталогу:
lcd /локальний/шлях
- Вихід з SFTP:
quit
- SFTP з нестандартним портом SSH (-P велика буква):
sftp -P 2222 user@example.com
Rsync через SSH:
- Призначення: Rsync - це потужний інструмент для синхронізації файлів та каталогів. Він особливо ефективний для передачі великих обсягів даних або для оновлення існуючих файлів, оскільки передає лише зміни, а не весь файл. Його можна використовувати через SSH для безпечної передачі.
- Переваги: Ефективність (передає тільки зміни), підтримка інкрементного резервного копіювання, відновлення перерваних передач, широкі можливості фільтрації та виключення.
- Недоліки: Синтаксис може бути складнішим для початківців порівняно з SCP.
Основні команди:
- **Синхронізація локального каталогу з віддаленим:**Bash
rsync -avz --progress /шлях/до/локального/джерела/ користувач@віддалений_хост:/шлях/до/віддаленого/призначення/
# Приклад:
rsync -avz --progress ~/mydata/ user@example.com:/home/user/backups/
-
a
: архівний режим (рекурсивне копіювання, збереження дозволів, часу, символічних посилань тощо) -
v
: докладний вивід -
z
: стиснення даних під час передачі -
-progress
: показує прогрес передачі
> Важливо: Слідкуйте за слешами в кінці шляхів. Якщо ви вказуєте /шлях/до/локального/джерела/
(зі слешем), rsync скопіює вміст каталогу. Якщо /шлях/до/локального/джерела
(без слеша), rsync скопіює сам каталог всередину призначення.
>
- **Синхронізація віддаленого каталогу з локальним:**Bash
rsync -avz --progress користувач@віддалений_хост:/шлях/до/віддаленого/джерела/ /шлях/до/локального/призначення/
# Приклад:
rsync -avz --progress user@example.com:/var/www/html/ ~/web_backups/
- **Rsync з нестандартним портом SSH:**Bash
rsync -avz -e "ssh -p 2222" /шлях/до/локального/джерела/ user@example.com:/шлях/до/віддаленого/призначення/
Загальні рекомендації для передачі файлів по SSH:
- Використовуйте SSH-ключі для автентифікації: Це набагато безпечніше та зручніше, ніж використання паролів, особливо для автоматизованих сценаріїв.
- Перевіряйте права доступу: Переконайтеся, що у вас є відповідні дозволи на читання вихідних файлів і запис у цільову директорію.
- Будьте уважні до шляхів: Правильно вказуйте повні шляхи до файлів та каталогів, або використовуйте відносні шляхи відносно вашого поточного робочого каталогу.
- Для великих файлів/директорій: Rsync є найкращим вибором завдяки його ефективності та можливості відновлення.
- Для інтерактивного управління файлами: SFTP надає зручніші можливості для навігації та маніпуляції файлами на віддаленому сервері.
- Для швидкого копіювання одного-двох файлів: SCP зазвичай є найпростішим і найшвидшим варіантом.
Підключення до SSH через роутер
Щоб під'єднатися до комп'ютера з локальною IP-адресою 192.168.0.26
через SSH, використовуючи публічну IP-адресу роутера (95.60.222.6
), потрібно виконати наступні кроки:
1. Налаштування Port Forwarding на роутері
Оскільки комп'ютер знаходиться за NAT (роутером), потрібно перенаправити зовнішній порт на локальний:
-
Зайдіть в адмін-панель роутера (наприклад, через
http://192.168.0.1
). - Знайдіть розділ Port Forwarding / Віртуальні сервери / NAT.
- Додайте нове правило:
-
Зовнішній порт (WAN Port):
2222
(або будь-який інший вільний, за замовчуванням SSH використовує22
, але це небезпечно). -
Локальна IP-адреса (Internal IP):
192.168.0.26
-
Локальний порт (Internal Port):
22
(якщо на комп'ютері SSH сервер слухає інший порт – вкажіть його). - Протокол: TCP
- Збережіть налаштування.
-
Зовнішній порт (WAN Port):
> Увага! Якщо ваш провайдер надає вам Carrier-Grade NAT (CGNAT), то Port Forwarding може не працювати. У такому разі можна використати VPN, SSH-тунель через сервер (Remote Port Forwarding) або сервіси типу Ngrok. >
2. Налаштування SSH на цільовому комп'ютері
Переконайтеся, що на комп'ютері (192.168.0.26
) встановлено та запущено SSH-сервер:
Для Linux (Ubuntu/Debian)
sudo apt update && sudo apt install openssh-server -y
sudo systemctl enable --now ssh
Перевірте, чи працює SSH:
sudo systemctl status ssh
Для Windows
- Відкрийте "Налаштування" → "Додатки" → "Додаткові компоненти".
- Знайдіть "OpenSSH Server" і встановіть його.
- Увімкніть службу:
Start-Service sshd
Set-Service -Name sshd -StartupType 'Automatic'
3. Підключення через SSH з іншого комп'ютера
Тепер можна підключатися з іншого пристрою через інтернет:
ssh username@95.60.222.6 -p 2222
(де username
– ім'я користувача на цільовому комп'ютері, 2222
– порт, який ви вказали в Port Forwarding).
4. Додатковий захист (рекомендовано)
-
Змініть стандартний порт SSH (наприклад, на
2222
у файлі/etc/ssh/sshd_config
). - Вимкніть вхід під root:
PermitRootLogin no
- Використовуйте ключі SSH замість паролів:
ssh-keygen -t ed25519
ssh-copy-id username@192.168.0.26
-
Встановіть фаєрвол (наприклад,
ufw
на Linux):
sudo ufw allow 2222/tcp
sudo ufw enable
Якщо виникнуть проблеми, перевірте:
- Чи працює SSH локально:
ssh username@192.168.0.26
- Чи відкритий порт на роутері:
nc -zv 95.60.222.6 2222
- Чи немає блокування з боку провайдера.
Доступ до android по ssh
- Встановіть Termux з Play Store.
- Відкрийте Termux і виконайте команди:
-
pkg install openssh
-
sshd
(це запустить SSH-сервер на стандартному порту 8022. Якщо хочете змінити порт, потрібно редагувати файл/data/data/com.termux/files/usr/etc/ssh/sshd_config
і перезапуститиsshd
). -
ifconfig
абоip a
(щоб дізнатися IP-адресу вашого пристрою).
-
- Задайте пароль для SSH:
passwd
(це встановить пароль для користувача Termux, який буде вашим SSH-логіном).
❯ ssh u0_a36@192.168.0.87 -p 8022
Назва користувача u0_a36
є системним ідентифікатором
Android і зазвичай не використовується для SSH-логінів. Якщо ви
використовуєте Termux, логін буде просто вашим ім'ям користувача Termux
(зазвичай u0_a...
, але при SSH підключенні це часто просто localhost
або termux
). Якщо ж додаток SSH-сервера дозволяє створювати користувачів, тоді перевірте, яке ім'я користувача він надає.
❯ scp linux-notes/week1/day1.md 5540:~/linux-notes/week1/
SSH-тунель
SSH-тунель — це спосіб захистити або переадресувати мережевий трафік через зашифроване з'єднання SSH. Він дозволяє створити "тунель" між вашим комп'ютером і віддаленим сервером, через який можна безпечно передавати дані, навіть якщо з'єднання проходить через незахищені мережі.
🔐 Види SSH-тунелів
1. Локальний тунель (Local Forwarding)
> Найпоширеніший тип. Ви переадресовуєте локальний порт на порт на віддаленому сервері або навіть на третій машині через SSH. >
Синтаксис:
ssh -L [локальний_порт]:[ціль_адреса]:[цільовий_порт] user@ssh-сервер
Приклад:
ssh -L 8080:localhost:80 user@remote.com
🡒 Ви зможете відкрити http://localhost:8080, і побачите вебсервер на remote.com:80.
2. Віддалений тунель (Remote Forwarding)
> Навпаки — трафік з віддаленого порту буде переадресований на локальний або інший комп’ютер, до якого має доступ ваш SSH-клієнт. >
Синтаксис:
ssh -R [віддалений_порт]:[локальна_адреса]:[локальний_порт] user@ssh-сервер
Приклад:
ssh -R 9090:localhost:3000 user@remote.com
🡒 Тепер на сервері remote.com доступ до localhost:3000 вашого комп’ютера через localhost:9090.
3. Динамічний тунель (Dynamic Forwarding / SOCKS-проксі)
> Цей тунель створює SOCKS-проксі. Усі програми, які підтримують SOCKS (наприклад, браузери), можуть через нього передавати трафік. >
Синтаксис:
ssh -D [локальний_порт] user@ssh-сервер
Приклад:
ssh -D 1080 user@remote.com
🡒 У браузері налаштуй проксі SOCKS5: localhost:1080. Увесь трафік піде через remote.com.
🔄 Сценарії використання
Сценарій | Тип тунелю | Опис |
---|---|---|
Перегляд локального сайту з інтернету | Remote | Віддалений порт переадресовується на локальний |
Безпечне з'єднання з БД через інтернет | Local | Тунель з localhost на сервер БД |
Обхід фаєрволів або цензури | Dynamic | Створює SOCKS-проксі через сервер у вільній країні |
Робота з інтерфейсом веб-програми за SSH NAT | Remote | Надсилає вебінтерфейс "назовні" |
🧰 Корисні опції SSH
Ключ | Пояснення |
---|---|
-N |
Не запускати команду, лише тунель |
-f |
Запустити у фоні |
-C |
Стиснення (може бути корисним для повільного з'єднання) |
-v |
Вивести відлагоджувальну інформацію (корисно при проблемах) |
-L |
Локальний тунель |
-R |
Віддалений тунель |
-D |
Динамічний тунель (SOCKS-проксі) |
-p |
Вказати порт ssh |
-4 |
Використовувати IPv4 |
-6 |
Використовувати IPv6 |
Приклад запуску у фоні:
ssh -f -N -L 3307:localhost:3306 user@remote.com
🔒 Безпека
Тунелі зашифровані (через SSH).
Якщо ви відкриваєте порти назовні (особливо з -R), перевіряйте /etc/ssh/sshd_config, щоб були дозволені такі тунелі:
GatewayPorts yes
AllowTcpForwarding yes
🔄 Завершення тунелю
Щоб завершити тунель, просто:
Натисни Ctrl+C, якщо він у терміналі.
Якщо запущено з -f -N, знайди процес SSH:
ps aux | grep ssh
kill [PID]
Category: Linux | Comments: 0